<?php

/**
 * класс для работы с таблице пользователей
 *
 * @author kingop
 */
class DatabaseObject_User extends DatabaseObject {

    public $categories = null;
    public static $userTypes = array(
                                     'member' => 'Пользователь',
                                     'admin' => 'Администратор',
                                     'seo' => 'SEO',
                                     'globaladmin' => 'Главный администратор'
                               );
    public $_newPassword = null;

    public function __construct($db) {
        parent::__construct($db, 'users', 'id');

        // далее перечислены все поля в таблице
        $this->add('login');
        $this->add('password');
        $this->add('company');
        $this->add('region');
        $this->add('city');
        $this->add('adress');
        $this->add('real_adress');
        $this->add('company_phone');
        $this->add('code');
        $this->add('email');
        $this->add('manager');
        $this->add('post');
        $this->add('phone');
        $this->add('isApproved');
        $this->add('type');
    }

    protected function postLoad() {
        parent::postLoad();

        // загрузим категори пользователя
        $this->categories = DatabaseObject_UsersCats::GetUserCategories($this->getDb(), $this->getId());
    }
    
    // функция залогинивания (а точнее, запись в сессию данных пользователя)
    public function createAuthIdentity() {
        $identity = new stdClass;
        $identity->id = $this->getId();
        $identity->login = $this->login;
        $identity->type = $this->type;
        $identity->manager = $this->manager;
        $identity->company = $this->company;
        $identity->email = $this->email;

        return $identity;
    }

    // проверка логина на занятость
    public function usernameExists($login) {
        $query = sprintf('select count(*) as num from %s where login = ?', $this->_table);

        $result = $this->_db->fetchOne($query, $login);

        return $result > 0;
    }
    
    // проверка email на занятость
    public function emailExists($email) {
        $query = sprintf('select count(*) as num from %s where email = ?', $this->_table);

        $result = $this->_db->fetchOne($query, $email);

        return $result > 0;
    }
    
    // проверка модерации аккаунта
    public static function IsApproved($db, $login) {
        $user = new DatabaseObject_User($db);
        if(!$user->load($login, 'login') || $user->isApproved)
            return true;
        
        return false;
    }

    // генерация пароля
    public function fetchPassword() {
        if (!$this->isSaved())
            return false;

        // сгенерируем новый пароль
        $this->_newPassword = time();
        $this->password = $this->_newPassword;
        
        // сохраним пользователя и отправим уведомление по email
        $this->save();
        $mail_subject = $this->login . ", Восстановление пароля";
        $mail_text = "
            Доброго времени суток! " . $this->login . ",

            Вы запросили изменение забытого пароля.

            Ваши данные для входа:

                Логин: " . $this->login . "
                Новый пароль: " . $this->_newPassword . "

            C уважением,

            Администрация.
        ";
        mail($this->email, $mail_subject, $mail_text);

        return true;
    }

    // проверка корректности логина
    static public function IsValidUsername($login) {
        $validator = new Zend_Validate_Alnum();
        return $validator->isValid($login);
    }

    public function __set($name, $value) {
        switch ($name) {
            case 'password':
                $value = md5($value);
                break;

            case 'type':
                if (!array_key_exists($value, self::$userTypes))
                    $value = 'member';
                break;
        }

        return parent::__set($name, $value);
    }

    // получение списка пользователей
    public static function GetUsers($db, $options = array()) {
        // инициализация параметров
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'u.login'
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // задаим поля. которые хотим получить
        $select->from(null, 'u.*');

        // другие параметры
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if ($options['where'] > 0)
            $select->where($options['where']);

        $select->order($options['order']);

        // получим данные
        $data = $db->fetchAll($select);

        // преобразуем данные в объекты класса
        $users = parent::BuildMultiple($db, __CLASS__, $data);

        // вернем массив пользователей
        return $users;
    }

    // получение количества пользователей
    public static function GetUsersCount($db, $options) {
        $select = self::_GetBaseQuery($db, $options);
        $select->from(null, 'count(*)');

        return $db->fetchOne($select);
    }
    
    // уведомление админов по емейлу о новой регистрации
    public static function SendAdminRegNotification($db, $id) {
        // напишу позже :)
    }

    private static function _GetBaseQuery($db, $options) {
        // инициализируем параметры
        $defaults = array('id' => array());

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        // создадим запрос
        $select = $db->select();
        $select->from(array('u' => 'users'), array());
        
        if($options['where']) {
            $select->where($options['where']);
        }
        if($options['limit']) {
            $select->limit($options['offset'] . ',' . $options['limit']);
        }


        // отфильтруем записи по id (если задано)
        if (count($options['id']) > 0)
            $select->where('u.id in (?)', $options['id']);

        return $select;
    }

    public function sendEmail($tpl) {
        $templater = new Templater();
        $templater->user = $this;

        // сформируем тело письма
        $body = $templater->render('email/' . $tpl);

        // тему письма возьмем из первой строчки шаблона
        list($subject, $body) = preg_split('/\r|\n/', $body, 2);

        // далее настройка и отправка
        $mail = new Zend_Mail();

        // укажем адрес и логин пользователя в поле "Кому"
        $mail->addTo($this->email, trim($this->login));

        // получим админские настройки "От кого"
        $mail->setFrom(Zend_Registry::get('config')->email->from->email, Zend_Registry::get('config')->email->from->name);

        // зададим тело письма и отправим
        $mail->setSubject(trim($subject));
        $mail->setBodyText(trim($body));
        $mail->send();
    }
    
    protected function preDelete() {
        parent::preDelete();
        // удалим заявки
        DatabaseObject_Requests::DeleteUserRequests($this->getDb(), $this->getId());
        // удалим категории
        DatabaseObject_UsersCats::DeleteUserCats($this->getDb(), $this->getId());
        
        return true;
    }
    
   
    // получение списка пользователей
    public static function FilterUsers($db, $filter = array(), $options = array()) {
        // инициализация параметров
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'u.login'
        );

        $filters = array(
            'idCat' => 0,
           
            'isApproved' => 2,
            'region' => '',
            'city' => '0',
        );
           
        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }
          foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // задаим поля. которые хотим получить
        $select->from(null, 'u.*');
        if (count($filter['idCat']) > 0)     $idCat = implode(",", $filter['idCat']);
        if (count($filter['region']) > 0)        $region = $filter['region'];
        if ($filter['city'] > 0)       $city = $filter['city'];
        if (($filter['isApproved'] != '') && ($filter['isApproved']!= '2'))       $isApproved =  $filter['isApproved'];
        
        if ($region != '')
        {$select->where('u.region = ?', $region);}  
         if ($city != '')
        {$select->where('u.city = ?' , $city);} 
          if ($isApproved != '')
        {$select->where('u.isApproved = ?', $isApproved); } 
          if ($idCat != '')
       {  
              $select->joinLeft(array('uc' => 'users_cats'),
                                     'u.id=uc.idUser ',
                                     array());
         $select->where('uc.idCat in (' . $idCat . ')');
       }
        //$where .='idUser in (' . $idUser . ')';} 
        // другие параметры
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if ($options['where'] > 0)
            $select->where($options['where']);

        $select->order($options['order']);
// $select->__toString();
        // получим данные
        $data = $db->fetchAll($select);

        // преобразуем данные в объекты класса
        $users = parent::BuildMultiple($db, __CLASS__, $data);

        // вернем массив пользователей
        return $users;
    }
}

?>
